syntax = "proto3";

package myfitt;
option go_package = ".;myfitt";

message StepDetails {
  //суммарное количество шагов в этот день
  uint32 steps = 1;
  // эпоходень за который считаются шаги
  uint32 day = 2;
  // пройденное расстояние в метрах
  uint32 meters = 3;
  // показатель подвижности в процентах
  uint32 movement_factor = 4;
  // детализация шагов (опционально)
  repeated StepsData samples = 5;
  // список устройств с которых были получены данные
  repeated string device = 8;
}

message HrDetails {
  // минимальный пульс
  uint32 min_hr = 1;
  // средний пульс
  uint32 avg_hr = 2;
  // максимальный  пульс
  uint32 max_hr = 3;
  // минимальная нагрузка
  double min_hardness = 4;
  // средняя нагрузка
  double avg_hardness = 5;
  // максимальная нагрузка
  double max_hardness = 6;
  // данные профиля на момент тренировки
  Profile profile = 7;
  // список устройств с которых была получена тренировка
  repeated string device = 8;
  // детализация пульса (опционально)
  repeated TrainingData samples = 9;
}



message TrainingSession {
  enum Type {
    unknown = 0;
    step = 1; // шаги
    pulse = 2; // пульсовые тренировки
  }
  // все что выше 900 это служебные значения, их не давать выбирать клиенту в UI
  enum Kind {
    fitness = 0; // общая категория - кардио, силовая тренировка, йога, гребля боевые искусства, растяжка гольф
    walk = 1; // ходьба
    run = 2; // бег
    swim = 3; // плавание
    cycle = 4; // велосипед
    ski = 5; // лыжи, горные лыжи
    rowing = 6; // гребля
    games = 7; // игровые/командные (футбол, волейбол, хоккей, баскетбол и т.п.)
    set_fitness = 900; // дополнительное значение варианта fitness (чтобы избежать игнорирования обновления)
    test = 996; // тест
    visit = 997; // визит
    other = 998; // прочее
  }
  enum Element {
    undefined = 0; // не выбрано
    chart = 1; // график
    medals = 2; // медали
  }
  // уникальный идентификатор сессии
  string id = 1;
  // время синхронизации
  int64 sync_millis = 2;
  // начало
  int64 start_millis = 3;
  // окончание
  int64 stop_millis = 4;
  // начисленно баллов за тренировку
  double skllzz = 6;
  // признак удаленной сессии
  bool deleted = 7;
  // идентификатор источника (уникален для мобильного телефона)
  string source_id = 8;
  // версия набора полей данных
  uint32 version = 9;
  // Вариант детализации тренировки
  oneof details {
    // Отчет по шагам
    StepDetails steps = 10;
    // Отчет по пульсу
    HrDetails hr = 11;
  }
  // часовой пояс сессии
  string timezone = 12;
  // созжено калорий за тренировку
  double kkal = 13;
  // идентификатор профиля которому принадлежит тренировка
  string profile_id = 14;

  // номер дня активности в часовом поясе клиента
  int64 activity_day = 15;
  // начислено баллов за тренировку без учета действия артефактов
  double skllzz_without_artifacts = 16;
  // начислено баллов за тренировку с учетом артефактов
  double skllzz_with_artifacts = 17;
  // Сопроводительный текст
  string description = 21;
  // Фотка к занятию
  string photo_url = 22;
  Kind kind = 32; // вид активности
  string arbitrary_kind = 33; // вид активности в форме произвольного названия от источника данных (если поддерживается)
}

message TrainingData {
  // уникальный идентификатор сессии
  string session_id = 1;
  // время синхронизации
  int64 sync_millis = 2;
  // время отсчета этой порции данных
  int64 stamp_millis = 3;
  // идентификатор источника данных
  string device_id = 4;
  // название источника данных
  string device_name = 5;
  // среднее значение пульса на интервале
  double hrAvg = 12;
  // длительность интервала в миллисекундах
  int32 duration = 13;
  // баллов за этот интервал
  double skllzz = 14;
  // уровень нагрузки от 0 до 1 внутри пульсовой зоны клиента
  double hardness = 15;
  // версия набора полей данных
  uint32 version = 16;
  // идентификатор профиля которому принадлежит тренировка
  string profile_id = 17;
}

message StepsData {
  // версия набора полей данных
  uint32 version = 1;
  // время синхронизации
  int64 sync_millis = 2;
  // время начала замера шагов
  int64 stamp_millis = 3;
  // длительность интервала замера в миллисекундах
  int32 duration = 4;
  // Шагов на интервале
  int32 steps = 5;
  // идентификатор источника (уникален для мобильного телефона)
  string source_id = 6;
  // идентификатор источников шагов (названия сенсоров)
  repeated string step_source = 7;
}


message Profile {
  string id = 1 ; // единый идентификатор
  int32 birth_date = 6; // epoch day (день с  полуночи (00:00:00 UTC) 1 января 1970 года)
  int32 hr_rest = 7; // пульс в состоянии покоя
  int32 hr_max = 8; // максимальный пульс
  Sex sex = 11; // пол человека
  float weight = 12; //вес в кг
  repeated PersonalGoal personal_goals = 60;
}

//цели клиента
enum PersonalGoal {
  unknown_goal = 0; // неизвестно
  lose_weight = 1; //  похудеть
  childrens_training = 2; //  тренировки для детей
  relief = 3; //  рельеф
  strength = 4; //  сила и выносливость
  antistress = 5; //  снять стресс
  learn_swim = 6; //  научиться плавать
  flexibility = 7; //  гибкость и мобильность
  body_balance = 8; //  гармоничное развитие тела
  fun = 9; //  весело провести время
  rehabilitation = 10; //  реабилитация и восстановление
}

//пол
enum Sex {
  undefined = 0; // не определен
  male = 1; // мужской
  female = 2; // женский
}


message Empty {
}


message InputDataset {
  Profile profile = 1; // профиль пользователя
  repeated TrainingSession sessions = 2; // последовательность активностей в произвольном количестве от 1 до 14 включительно
}


